package com.service.infoEntry.service.impl;

import com.alibaba.excel.EasyExcel;
import com.service.config.utils.DateUtils;
import com.service.config.utils.IdUtil;
import com.service.config.utils.ModelMapperUtil;
import com.service.config.utils.Result;
import com.service.infoEntry.dao.ProgrammeDao;
import com.service.infoEntry.dao.TeamDao;
import com.service.infoEntry.dao.TroubleInfoDao;
import com.service.infoEntry.dto.ExportTroubleInfoDto;
import com.service.infoEntry.dto.TroubleInfoDto;
import com.service.infoEntry.entity.*;
import com.service.infoEntry.service.*;
import com.service.infoEntry.vo.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

import static com.service.infoEntry.constant.Constant.*;

/**
 * @author hjl
 */
@Service
public class TroubleServiceImpl implements TroubleService {
    @Resource
    private TroubleInfoDao troubleInfoDao;
    @Resource
    private UserInfoService userService;
    @Resource
    private TeamService teamService;
    @Resource
    private CommentService commentService;
    @Resource
    private ProgrammeDao programmeDao;
    @Resource
    private TeamDao teamDao;
    @Value("${spring.fileUrl}")
    String fileUrl;
    @Value("${spring.filePath}")
    String filePath;

    private Integer NO = 1;

    @Override
    public Result addTrouble(TroubleInfoDto troubleInfoDto,String userId) {
        TroubleInfo troubleInfo = ModelMapperUtil.strictMap(troubleInfoDto, TroubleInfo.class);
        troubleInfo.setId(IdUtil.getStringId());
        troubleInfo.setTroubleTime(DateUtils.getNowDate());
        troubleInfo.setStatus(0);
        troubleInfo.setConclusion(0);
        troubleInfo.setUpdateTime(DateUtils.getNowDate());
        ProgrammeInfo programmeInfo = programmeDao.queryProgrammeById(troubleInfo.getProgrammeId());
        if(null == programmeInfo)
        {
            return Result.failure(PROGRAMME_NOT_EXIST,PROJECT_DOES_NOT_EXIST);
        }
        troubleInfo.setStatus(Integer.parseInt(programmeInfo.getProgrammeStatus()));

        //生成编号(如:20200101001-001)
        String troubleNo = programmeInfo.getNum()+ "-" +StringUtils.leftPad(String.valueOf(NO++), 6, '0');
        List<String> allTroubleNos = troubleInfoDao.queryAllNo(troubleInfoDto.getTeamId());

        ////避免问题编号重复
        if(allTroubleNos!=null && allTroubleNos.size()>0)
        {
            boolean flag = true;
            while(flag)
            {
                for (String programmeNo : allTroubleNos) {
                    if(troubleNo.equals(programmeNo))
                    {
                        troubleNo = programmeInfo.getNum()+ "-" +StringUtils.leftPad(String.valueOf(NO++), 3, '0');
                        flag = true;
                        break;
                    }
                    flag = false;
                }
            }
        }
        troubleInfo.setNo(troubleNo);
        troubleInfoDao.saveTrouble(troubleInfo);
        return Result.ok();
    }

    @Override
    public void updateTrouble(TroubleInfoDto troubleInfoDto) {
        TroubleInfo troubleInfo = ModelMapperUtil.strictMap(troubleInfoDto, TroubleInfo.class);
        troubleInfo.setUpdateTime(DateUtils.getNowDate());
        troubleInfoDao.updateTrouble(troubleInfo);
    }

    @Override
    public TroubleVo searchTroubleByNo(String no,String userId) {
        TroubleInfo troubleInfo = troubleInfoDao.searchTroubleByNo(no);
        if(null != troubleInfo)
        {
            TroubleVo troubleVo = ModelMapperUtil.strictMap(troubleInfo, TroubleVo.class);
            UserVo userVo = userService.queryByUserId(troubleInfo.getUserId());
            if(null != userVo)
            {
                if(userId.equals(troubleInfo.getUserId()))
                {
                   userVo.setCurrentUser(true);
                }
                troubleVo.setUserVo(userVo);
            }
            TeamVo teamVo = teamService.queryTeamByTeamId(troubleInfo.getTeamId());
            List<CommentVo> commentVoList = commentService.queryAllCommentByTroubleId(troubleInfo.getId(),userId);
            if(teamVo!=null)
            {
                troubleVo.setTeamName(teamVo.getTeamName());
            }
            if(commentVoList!=null && commentVoList.size()>0)
            {
                troubleVo.setCommentInfoList(commentVoList);
            }
            return troubleVo;
        }
        return null;
    }

    @Override
    public List<TroubleVo> queryTroubleOfProgramme(String programmeId,String userId,String teamId) {
        List<TroubleInfo> troubleInfos = troubleInfoDao.queryTroubleOfProgramme(programmeId);
        TroubleVo troubleVo;
        UserVo userVo;
        TeamVo teamVo;
        ProgrammeInfo programmeInfo;
        List<CommentVo> commentInfoList;

        List<TroubleVo> troubleVoList = new ArrayList<>();
        for (TroubleInfo troubleInfo : troubleInfos) {
            troubleVo = ModelMapperUtil.strictMap(troubleInfo, TroubleVo.class);

             userVo = userService.queryByUserId(troubleInfo.getUserId());
             teamVo = teamService.queryTeamByTeamId(troubleInfo.getTeamId());
             programmeInfo = programmeDao.queryProgrammeById(troubleInfo.getProgrammeId());
             commentInfoList = commentService.queryAllCommentByTroubleId(troubleInfo.getId(),userId);
             if(userId.equals(troubleInfo.getUserId()))
             {
                 userVo.setCurrentUser(true);
             }
             if(userVo.getFullName()==null)
             {
                 userVo.setFullName("");
             }
             troubleVo.setUserVo(userVo);
             troubleVo.setTeamName(teamVo.getTeamName());
             troubleVo.setProgrammeName(programmeInfo.getName());
             troubleVo.setCommentInfoList(commentInfoList);
            troubleVoList.add(troubleVo);
        }
        return troubleVoList;
    }

    @Override
    public List<TroubleVo> searchTroubleByDesc(String desc,String userId,String teamId) {
        List<TroubleVo> troubleVoList = new ArrayList<>();
        List<CommentVo> commentVoList;
        List<TroubleInfo> troubleInfos = troubleInfoDao.searchTroubleByDesc("%" + desc + "%");
        TroubleVo troubleVo;
        UserVo userVo;
        if(null!=troubleInfos && troubleInfos.size()>0)
        {
            for (TroubleInfo troubleInfo : troubleInfos) {
                troubleVo = ModelMapperUtil.strictMap(troubleInfo,TroubleVo.class);
                userVo = userService.queryByUserId(troubleInfo.getUserId());
                if(userId.equals(troubleInfo.getUserId()))
                {
                    userVo.setCurrentUser(true);
                }
                troubleVo.setUserVo(userVo);

                ProgrammeInfo programmeInfo = programmeDao.queryProgrammeById(troubleVo.getProgrammeId());
                troubleVo.setProgrammeName(programmeInfo.getName());

                commentVoList = commentService.queryAllCommentByTroubleId(troubleVo.getId(),userId);
                troubleVo.setCommentInfoList(commentVoList);
                troubleVoList.add(troubleVo);
            }
        }
        return troubleVoList;
    }

    @Override
    public String exportTroubleList(String teamId, String userId) {
        //声明所有导出问题集合
        List<ExportTroubleInfoDto> exportTroubleList = new ArrayList<>();
        //当前用户的当前团队下的所有公开项目和自己的所有项目
        List<ProgrammeInfo> programmeInfos = programmeDao.queryProgrammesByTeamId(teamId,userId);
        if(null == programmeInfos || programmeInfos.size()<=0)
        {
            return null;
        }

        //所有的问题列表
        List<TroubleInfo> allTroubleList = new ArrayList<>();
        //某项目下所有的问题列表
        List<TroubleInfo> list;
        for (ProgrammeInfo programmeInfo : programmeInfos) {
             list = troubleInfoDao.queryOpenTroubleOfProgramme(programmeInfo.getId(),userId);
             if(list!=null && list.size()>0)
             {
                 allTroubleList.addAll(list);
             }
        }
        //判断团队下是否有问题
        if(allTroubleList==null || allTroubleList.size()<=0)
        {
            return null;
        }

        //当前团队下所有用户
        List<UserInfo> userInfos = teamDao.queryAllUserInTeam(teamId);
        //当前团队信息
        TeamInfo teamInfo = teamDao.queryTeamByTeamId(teamId);

        ExportTroubleInfoDto exportTrouble;
        for (TroubleInfo troubleInfo : allTroubleList) {
            exportTrouble = ModelMapperUtil.strictMap(troubleInfo, ExportTroubleInfoDto.class);
            for (UserInfo info : userInfos) {
                if(troubleInfo.getUserId().equals(info.getId()))
                {
                    exportTrouble.setUser(info.getUsername());
                }
            }

            for (ProgrammeInfo programmeInfo : programmeInfos) {
                if(troubleInfo.getProgrammeId().equals(programmeInfo.getId()))
                {
                    exportTrouble.setProgrammeNO(programmeInfo.getNum());
                }
            }
            exportTrouble.setTeamName(teamInfo.getTeamName());
            exportTroubleList.add(exportTrouble);
        }
        EasyExcel.write(filePath+"问题清单_"+exportTroubleList.get(0).getNo()+".xlsx",ExportTroubleInfoDto.class).sheet().doWrite(exportTroubleList);
        return fileUrl+"问题清单_"+exportTroubleList.get(0).getNo()+".xlsx";
    }
}
